package com.lqk.interpreter.experss;

import java.util.HashMap;
import java.util.Stack;

public class Calculator {

	// 定义表达式
	private Expression expression;

	// 构造函数传参，并解析
	public Calculator(String expStr) {	// expStr = a+b-c
		// 安排运算先后顺序
		Stack<Expression> stack = new Stack<>();
		// 表达式拆分成字符数组	[a,+,b,-,c]
		char[] charArray = expStr.toCharArray();

		Expression left = null;
		Expression right = null;
		// 遍历字符数组 [a,+,b,-,c]
		// 针对不同的情况，做不同的处理
		for (int i = 0; i < charArray.length; i++) {
			switch (charArray[i]) {
				case '+': //
					left = stack.pop();// 从stack 中取出 left => "a"
					right = new VarExpression(String.valueOf(charArray[++i]));// 取出右表达式 "b"
					stack.push(new AddExpression(left, right));// 然后根据得到的 left 和 right 构建 AddExpression 加入 stack
					break;
				case '-': //
					left = stack.pop();
					right = new VarExpression(String.valueOf(charArray[++i]));
					stack.push(new SubExpression(left, right));
					break;
				default:
					// 如果是一个Var，就创建 VarExpression 对象，并push 到 stack
					stack.push(new VarExpression(String.valueOf(charArray[i])));
					break;
			}
		}
		// 遍历完整个 charArray 数组后，stack就拿到最后的 Expression
		this.expression = stack.pop();
	}

	public int run(HashMap<String, Integer> var) {
		// 最后将表达式和 Var 绑定, 然后传递给expression 的 interpreter进行解释执行
		return this.expression.interpreter(var);
	}
}